package com.woniuxy.courseweb.controller;


import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.woniuxy.core.exception.ParameterValidException;
import com.woniuxy.core.model.Result;
import com.woniuxy.core.status.CourseTypeStateEnum;
import com.woniuxy.core.util.MyJwtUtil;
import com.woniuxy.core.util.PageInfo;
import com.woniuxy.coursedao.model.CourseType;
import com.woniuxy.coursemodel.form.*;
import com.woniuxy.coursemodel.param.*;
import com.woniuxy.courseservice.service.CourseTypeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 冉杰
 * @since 2024-01-15
 */
@RestController
@RequestMapping("/courseType")
@Api(tags = "课程类型相关接口")
public class CourseTypeController {
    @Resource
    private CourseTypeService courseTypeService;

    /**
     *
     * @param form 新增类型的参数列表
     * @return 无
     */
    @ApiOperation("新增课程类型方法")
    @PostMapping("/add.venue")
    public Result<?> add(@RequestBody @Validated AddCourseTypeForm form,@RequestHeader String token){
        Integer venueId = MyJwtUtil.getVenueIdByKey(token, "venueId");
        AddCourseTypeParam param = BeanUtil.toBean(form, AddCourseTypeParam.class);
        param.setVenueId(venueId);
        courseTypeService.add(param);
        return Result.success("新增课程类型成功");
    }

    /**
     *
     * @param form 修改类型的参数列表
     * @return 无
     */
    @ApiOperation("修改课程类型方法")
    @PostMapping("/modify.venue")
    public Result<?> modify(@RequestBody @Validated ModifyCourseTypeForm form,@RequestHeader String token){
        ModifyCourseTypeParam param = BeanUtil.toBean(form, ModifyCourseTypeParam.class);
        Integer venueId = MyJwtUtil.getVenueIdByKey(token, "venueId");
        param.setVenueId(venueId);
        courseTypeService.modify(param);
        return Result.success("修改课程类型成功");
    }

    /**
     *
     * @param form 启用类型参数列表 类型id
     * @return 无
     */
    @ApiOperation("启用课程类型方法")
    @PostMapping("/enable.venue")
    public Result<?> enable(@RequestBody @Validated CourseTypeEnableForm form,@RequestHeader String token){
        ChangeStateParam param = BeanUtil.toBean(form, ChangeStateParam.class);
        param.setCourseTypeState(CourseTypeStateEnum.TYPE_ENABLE.getCode());
        Integer venueId = MyJwtUtil.getVenueIdByKey(token, "venueId");
        param.setVenueId(venueId);
        courseTypeService.changeState(param);
        return Result.success("启用课程类型成功");
    }

    /**
     *
     * @param form 禁用类型参数列表（类型id）
     * @return 无
     */
    @ApiOperation("禁用课程类型方法")
    @PostMapping("/disable.venue")
    public Result<?> disable(@RequestBody @Validated CourseTypeDisableForm form,@RequestHeader String token){
        ChangeStateParam param = BeanUtil.toBean(form, ChangeStateParam.class);
        param.setCourseTypeState(CourseTypeStateEnum.TYPE_DISABLE.getCode());
        Integer venueId = MyJwtUtil.getVenueIdByKey(token, "venueId");
        param.setVenueId(venueId);
        courseTypeService.changeState(param);
        return Result.success("禁用课程类型成功");
    }

    /**
     *
     * @param form 分页查询参数列表（页码、每页条数、类型名称）
     * @return pageInfo 分页对象
     */
    @ApiOperation("分页查询课程类型方法")
    @PostMapping("/byPage.venue")
    public Result<?> byCondition(@RequestBody @Validated CourserTypeByPageForm form,@RequestHeader String token){
        Integer venueId = MyJwtUtil.getVenueIdByKey(token, "venueId");
        CourserTypeByPageParam param = BeanUtil.toBean(form, CourserTypeByPageParam.class);
        param.setVenueId(venueId);
        PageInfo<CourseType> pageInfo = courseTypeService.byPage(param);
        return Result.success("分页查询课程类型成功",pageInfo);
    }

    /**
     *
     * @return 全部可用类型
     */
    @ApiOperation("用户查全部可用类型方法")
    @GetMapping("/all")
    public Result<List<CourseType>> all(){
        List<CourseType> courseTypes = courseTypeService.list(new LambdaQueryWrapper<CourseType>().eq(CourseType::getCourseTypeState, CourseTypeStateEnum.TYPE_ENABLE.getCode()));
        return Result.success("查全部可用类型成功",courseTypes);
    }

    /**
     *
     * @param courseTypeId 课程类型id
     * @return 课程类型对象
     */
    @ApiOperation("通过id查类型方法")
    @GetMapping("/byId")
    public Result<CourseType> byId(Integer courseTypeId){
        CourseType courseType = courseTypeService.byId(courseTypeId);
        return Result.success("通过id查类型成功",courseType);
    }
}

